﻿
#include<stdio.h>

//浮点数与整数在内存中的存储方式不一样
//用什么样的格式打印，决定了编译器看待内存中数据的方式

//任意一个二进制浮点数都可以表示成 ：V   =  (−1)^S* M ∗ 2^E
//(−1)^S是符号位，S为0时是正数，S为1时是负数
//M是有效数字，1≤M＜2                  E是指数位
//又可称 S符号 M尾数 E阶码

//阶码的全0和全1是特殊情况，当阶码非全0或全1时，表示规格化小数
//阶码全0时： 若尾数全0，表示正负0 ；若尾数非全0，表示非规格化的小数，具体解读方法和规格化小数稍有不同
//阶码全1时： 若尾数全0，表示正负无穷；若尾数非全0，表示一个未定义数 NaN    not a number

//IEEE754标准
//32位浮点数：最高1位是符号位，接着8位是指数E，最后23位是有效数字M
//64位浮点数：最高1位是符号位，接着11位是指数E，最后52位是有效数字M

//由于M总是1.xxxx 因此计算机中存储M时，总是默认M的第一位是1，在内存中的存储可舍去，读取时再把1加上
// 这样对于32位浮点数，23位的存储空间实际上可以表示的有效数字是24位

//对阶码E，内存存储的是一个无符号整数，  但实际上表示一个小数时的指数可正可负
//阶码E的存储：实际存储的是移码，即  十进制真值+偏置值 再转为无符号整数二进制形式存储
 // 8位的偏置值为127，11为的偏置值为1023
//例如  对于32位浮点数，想要表示指数为2，再内存中实际存储的是 2+127=129对应二进制 10000001 

int main() {
	int n = 9;
	float* p = (float*)&n;
	printf("%d\n", n);
	printf("%f\n", *p);
	*p = 9.0f;
	printf("%f\n", *p);
	printf("%d\n", n);      
	





	system("pause");
	return 0;
}